package Interfaz;

import java.util.ArrayList;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Monitor;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Button;
import DTO.DTOGestionarResultado;
import DTO.DTOSets;
import Excepcion.CompetenciaNoPermiteEmpateException;
import Excepcion.EmpateEnEliminacionException;
import Excepcion.EmpateSetException;
import Excepcion.EspaciosVaciosException;
import Excepcion.FaltanPartidosAnterioresException;
import Excepcion.PuntajeNegativoException;
import Excepcion.PuntajeOverflowException;
import Excepcion.ResultadoNoModificableException;
import Negocios.ControlFixture;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.wb.swt.SWTResourceManager;


/**
 * CU018 - Gestionar resultados de fixture (Set)
 * @author 
 */
public class CU018_set {

	protected Shell shlEditarResultado;

	CU019 pantallaAnterior;
	
	int idCompetencia;
	int idFecha;
	int idPartido;
	
	int cantidadDeSets;
	
	ArrayList<Text> setsParticipante1 = new ArrayList<Text>();
	ArrayList<Text> setsParticipante2 = new ArrayList<Text>();
	
	DTOSets dtoSets;
	
	public CU018_set(int idCompetencia, CU019 pantallaAnterior,
			int idFecha, int idPartido) {
		this.idCompetencia = idCompetencia;
		this.pantallaAnterior = pantallaAnterior;
		this.idFecha = idFecha;
		this.idPartido = idPartido;
		
		ControlFixture controlFixture = new ControlFixture();
		dtoSets = controlFixture.getDTOSets(idPartido);
		cantidadDeSets = controlFixture.getCantidadSets(idCompetencia);
	}

	/**
	 * Open the window.
	 */
	public void open() {
		Display display = Display.getDefault();
		createContents();
		
		// Centrar ventana
		Monitor primary = display.getPrimaryMonitor();
		Rectangle bounds = primary.getBounds();
		Rectangle rect = shlEditarResultado.getBounds();	    
		int x = bounds.x + (bounds.width - rect.width) / 2;
		int y = bounds.y + (bounds.height - rect.height) / 2;	    
		shlEditarResultado.setLocation(x, y);
		
		ScrolledComposite scrolledComposite = new ScrolledComposite(shlEditarResultado, SWT.BORDER | SWT.V_SCROLL);
		scrolledComposite.setAlwaysShowScrollBars(true);
		scrolledComposite.setBounds(10, 10, 265, 161);
		scrolledComposite.setExpandHorizontal(true);
		scrolledComposite.setExpandVertical(true);
		
		Composite composite = new Composite(scrolledComposite, SWT.NONE);
		
		Label lblNroSet = new Label(composite, SWT.NONE);
		lblNroSet.setBounds(10, 10, 41, 15);
		lblNroSet.setText("Nro. set");
		
		Label lblParticipante = new Label(composite, SWT.NONE);
		lblParticipante.setBounds(66, 10, 72, 15);
		lblParticipante.setText(dtoSets.getParticipante1());
		
		Label lblParticipante_1 = new Label(composite, SWT.NONE);
		lblParticipante_1.setText(dtoSets.getParticipante2());
		lblParticipante_1.setBounds(155, 10, 72, 15);
		
		int coordYLabel = 34, coordYTxt = 31;
		
		for (int i = 0; i < cantidadDeSets; i++) {
			Label lblSet = new Label(composite, SWT.CENTER);
			lblSet.setBounds(10, coordYLabel, 41, 15);
			lblSet.setText(new Integer(i + 1).toString());
			
			final Text txtPuntajeParticipante1 = new Text(composite, SWT.BORDER);
			final Text txtPuntajeParticipante2 = new Text(composite, SWT.BORDER);
			
			txtPuntajeParticipante1.setBounds(66, coordYTxt, 72, 21);
			txtPuntajeParticipante1.addFocusListener(new FocusListener() {
				public void focusGained(FocusEvent e) {
					txtPuntajeParticipante1.setBackground(SWTResourceManager.getColor(255, 255, 255));
					txtPuntajeParticipante2.setBackground(SWTResourceManager.getColor(255, 255, 255));
			    }
				
			    public void focusLost(FocusEvent e) {
			    	try {
			    		if (Integer.parseInt(txtPuntajeParticipante1.getText()) < 0
			    				|| Integer.parseInt(txtPuntajeParticipante1.getText()) > 9999) {
			    			txtPuntajeParticipante1.setBackground(SWTResourceManager.getColor(255, 153, 153));
			    		}
			    	}
			    	catch (NumberFormatException ex) {
			    		txtPuntajeParticipante1.setBackground(SWTResourceManager.getColor(255, 153, 153));
			    	}
			    }
			});
			
			txtPuntajeParticipante2.setBounds(155, coordYTxt, 72, 21);
			txtPuntajeParticipante2.addFocusListener(new FocusListener() {
				public void focusGained(FocusEvent e) {
					txtPuntajeParticipante1.setBackground(SWTResourceManager.getColor(255, 255, 255));
					txtPuntajeParticipante2.setBackground(SWTResourceManager.getColor(255, 255, 255));
			    }
				
			    public void focusLost(FocusEvent e) {
			    	try {
			    		if (Integer.parseInt(txtPuntajeParticipante2.getText()) < 0
			    				|| Integer.parseInt(txtPuntajeParticipante2.getText()) > 9999) {
			    			txtPuntajeParticipante2.setBackground(SWTResourceManager.getColor(255, 153, 153));
			    		}
			    	}
			    	catch (NumberFormatException ex) {
			    		txtPuntajeParticipante2.setBackground(SWTResourceManager.getColor(255, 153, 153));
			    	}
			    }
			});
			
			coordYLabel += 27;
			coordYTxt += 27;
			
			setsParticipante1.add(txtPuntajeParticipante1);
			setsParticipante2.add(txtPuntajeParticipante2);
		}
		
		scrolledComposite.setContent(composite);
		scrolledComposite.setMinSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
		
		shlEditarResultado.open();
		shlEditarResultado.layout();
		while (!shlEditarResultado.isDisposed()) {
			if (!display.readAndDispatch()) {
				display.sleep();
			}
		}
	}

	/**
	 * Create contents of the window.
	 */
	protected void createContents() {
		shlEditarResultado = new Shell(SWT.CLOSE | SWT.TITLE | SWT.MIN);
		shlEditarResultado.setSize(291, 272);
		shlEditarResultado.setText("Editar resultado");
		shlEditarResultado.addListener(SWT.Close, new Listener() {
			public void handleEvent(Event event) {
				pantallaAnterior.actualizar();
				pantallaAnterior.shlFixture.setVisible(true);
				pantallaAnterior.shlFixture.forceFocus();
			}
		});
		
		Button btnGuardar = new Button(shlEditarResultado, SWT.NONE);
		btnGuardar.setText("Guardar");
		btnGuardar.setBounds(20, 192, 108, 32);
		btnGuardar.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				if (datosValidos()) {
					ArrayList<Integer> setsP1 = new ArrayList<Integer>();
					ArrayList<Integer> setsP2 = new ArrayList<Integer>();
					
					for (int i = 0; i < cantidadDeSets; i++) {
						setsP1.add(Integer.parseInt(setsParticipante1.get(i).getText()));
						setsP2.add(Integer.parseInt(setsParticipante2.get(i).getText()));
					}
					
					DTOGestionarResultado dtoNuevoResultado = new DTOGestionarResultado(idCompetencia,
							idPartido, -1, -1, -1, setsP1, setsP2);
					dtoNuevoResultado.setIdFecha(idFecha);
					dtoNuevoResultado.setAusente1(false);
					dtoNuevoResultado.setAusente2(false);
					
					ControlFixture controlFixture = new ControlFixture();
					
					try {
						controlFixture.gestionarResultado(dtoNuevoResultado);
						
						MessageBox mensaje = new MessageBox(shlEditarResultado, SWT.ICON_INFORMATION);
						mensaje.setMessage("Los sets han sido guardados exitosamente.");
						mensaje.open();
						
						shlEditarResultado.close();
					}
					catch (ResultadoNoModificableException ex) {
						MessageBox error = new MessageBox(shlEditarResultado, SWT.ICON_ERROR);
						error.setMessage(ex.getMensaje());
						error.open();
					}
					catch (EmpateEnEliminacionException ex) {
						MessageBox error = new MessageBox(shlEditarResultado, SWT.ICON_ERROR);
						error.setMessage(ex.getMensaje());
						error.open();
					}
					catch (FaltanPartidosAnterioresException ex) {
						MessageBox error = new MessageBox(shlEditarResultado, SWT.ICON_ERROR);
						error.setMessage(ex.getMensaje());
						error.open();
					}
					catch (CompetenciaNoPermiteEmpateException ex) {
						MessageBox error = new MessageBox(shlEditarResultado, SWT.ICON_ERROR);
						error.setMessage(ex.getMensaje());
						error.open();
					}
					catch (PuntajeNegativoException ex) {
						MessageBox error = new MessageBox(shlEditarResultado, SWT.ICON_ERROR);
						error.setMessage(ex.getMensaje());
						error.open();
					}
					catch (EspaciosVaciosException ex) {
						MessageBox error = new MessageBox(shlEditarResultado, SWT.ICON_ERROR);
						error.setMessage(ex.getMensaje());
						error.open();
					}
					catch (EmpateSetException ex) {
						MessageBox error = new MessageBox(shlEditarResultado, SWT.ICON_ERROR);
						error.setMessage(ex.getMensaje());
						error.open();
					}
					catch (PuntajeOverflowException ex) {
						MessageBox error = new MessageBox(shlEditarResultado, SWT.ICON_ERROR);
						error.setMessage(ex.getMensaje());
						error.open();
					}
				}
			}
		});
		
		Button btnCancelar = new Button(shlEditarResultado, SWT.NONE);
		btnCancelar.setText("Cancelar");
		btnCancelar.setBounds(155, 192, 108, 32);
		btnCancelar.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				shlEditarResultado.close();
			}
		});
	}

	protected boolean datosValidos() {
		for (int i = 0; i < cantidadDeSets; i++) {
			try {
	    		if (Integer.parseInt(setsParticipante1.get(i).getText()) < 0
	    				|| Integer.parseInt(setsParticipante1.get(i).getText()) > 9999) {
	    			setsParticipante1.get(i).setBackground(SWTResourceManager.getColor(255, 153, 153));
	    			
	    			MessageBox error = new MessageBox(shlEditarResultado, SWT.ICON_ERROR);
	    			error.setMessage("Puntaje inv\u00E1lido.\n"
	    					+ "Debe ingresar un valor entero entre 0 (cero) y 9999 "
	    					+ "(nueve mil novecientos noventa y nueve).");
	    			error.open();
	        		
	        		return false;
	    		}
	    	}
	    	catch (NumberFormatException ex) {
	    		setsParticipante1.get(i).setBackground(SWTResourceManager.getColor(255, 153, 153));
	    		
	    		MessageBox error = new MessageBox(shlEditarResultado, SWT.ICON_ERROR);
    			error.setMessage("Puntaje inv\u00E1lido.\n"
    					+ "Debe ingresar un valor entero entre 0 (cero) y 9999 "
    					+ "(nueve mil novecientos noventa y nueve).");
    			error.open();
        		
        		return false;
	    	}
			
			try {
	    		if (Integer.parseInt(setsParticipante2.get(i).getText()) < 0
	    				|| Integer.parseInt(setsParticipante2.get(i).getText()) > 9999) {
	    			setsParticipante2.get(i).setBackground(SWTResourceManager.getColor(255, 153, 153));
	    			
	    			MessageBox error = new MessageBox(shlEditarResultado, SWT.ICON_ERROR);
	    			error.setMessage("Puntaje inv\u00E1lido.\n"
	    					+ "Debe ingresar un valor entero entre 0 (cero) y 9999 "
	    					+ "(nueve mil novecientos noventa y nueve).");
	    			error.open();
	        		
	        		return false;
	    		}
	    	}
	    	catch (NumberFormatException ex) {
	    		setsParticipante2.get(i).setBackground(SWTResourceManager.getColor(255, 153, 153));
	    		
	    		MessageBox error = new MessageBox(shlEditarResultado, SWT.ICON_ERROR);
    			error.setMessage("Puntaje inv\u00E1lido.\n"
    					+ "Debe ingresar un valor entero entre 0 (cero) y 9999 "
    					+ "(nueve mil novecientos noventa y nueve).");
    			error.open();
        		
        		return false;
	    	}
			
			if (Integer.parseInt(setsParticipante1.get(i).getText())
					== Integer.parseInt(setsParticipante2.get(i).getText())) {
				setsParticipante1.get(i).setBackground(SWTResourceManager.getColor(255, 153, 153));
				setsParticipante2.get(i).setBackground(SWTResourceManager.getColor(255, 153, 153));
	    		
	    		MessageBox error = new MessageBox(shlEditarResultado, SWT.ICON_ERROR);
    			error.setMessage("Empate no permitido.\n"
    					+ "Debe ingresar valores distintos por cada set.");
    			error.open();
        		
        		return false;
			}
		}
		
		return true;
	}
}
